将java.nio.ByteBuffer a转换为(新创建的)CharBuffer b或char [] b的最快方法是什么。 这样做很重要,a [i] == b [i]。这意味着,不是a [i]和a [i + 1]一起组成一个值b [j],getChar(i)会做什么,但是这些值应该“扩展”。 byte a [] = {1,2,3,125,126,127,-128,-127,-126} //每个字节(已签名) char b [] = {1,2,3,125,126,127,128,129,130} //每个为char(未签名) 请注意,字节:-128具有与char:128相同(低8位)的位。因此,我认为“最佳”解释将如上所述,因为位是相同的。 之后,我还需要反之亦然的翻译:将char []或java.nio.CharBuffer返回到java.nio.ByteBuffer的最有效方法。
2021-01-06 08:17:34
因此,您想要的是使用编码ISO-8859-1进行转换。 我对效率没有任何要求,但至少写起来很短: CharBuffer结果= Charset.forName(“ ISO-8859-1”)。decode(byteBuffer); 另一个方向是: ByteBuffer结果= Charset.forName(“ ISO-8859-1”)。encode(charBuffer); 请对照其他解决方案对此进行衡量。 (公平地说,不应包含Charset.forName部分,并且也应该仅执行一次,而不是再次对每个缓冲区执行一次。) 从Java 7开始,还有带有预先实例化的Charset实例的StandardCharsets类,因此您可以使用 CharBuffer结果= StandardCharsets.ISO_8859_1.decode(byteBuffer); 和 ByteBuffer结果= StandardCharsets.ISO_8859_1.encode(charBuffer); 代替。 (这些行与以前的行相同,只是查找更容易,并且没有错误输入名称的风险,也无需捕获不可能的异常。) | 我同意@Ishtar的建议,建议完全避免转换为新结构,而仅在需要时进行转换。 但是,如果您有堆ByteBuffer,则可以这样做。 ByteBuffer bb = ... byte [] array = bb.array(); char [] chars = new char [bb.remaining()]; 对于(int i = 0; i